import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

plt.style.use("fivethirtyeight")
sns.set_style({'font.sans-serif':['SimHei','Arial']})
original=pd.read_csv('.\SF-Salaries-master\Salaries.csv')
original.info()

objlist = ['BasePay', 'OvertimePay', 'OtherPay', 'Benefits']
for obj in objlist:
    original[obj] = pd.to_numeric(original[obj], errors = 'coerce') # 都转换为int或float类型
original.info()

print(original['Year'].unique()) # 年份数据

print(original.groupby(["Year"])[["BasePay"]].mean()) # 每年的基础工资的平均值

print(original[original['TotalPayBenefits'] == original['TotalPayBenefits'].min()]) # 工资最少的那个人

print(original[original['OvertimePay'] == original['OvertimePay'].max()]) # 加班工资最多的那个人

print(original.groupby('Status')['BasePay'].mean()) # 查看PT(兼职)和FT(全职)各自的基础工资的平均值

'''
数据可视化
数据可视化是用python进行数据分析的一个非常棒的功能，几行简单的代码就可以生成各种酷炫的图表，将数据非常直观的表现出来，主要是依托于第三方库matplotlib，seaborn来实现。（第三方库也是python的一个特色了。）
利用柱形图查看这四年的平均薪资最高的职业top5:

'''

# 因为打算以子图组合的形式呈现出来，所以我们先筛选这4年的数据
a=original.loc[original["Year"]==2011]
b=original.loc[original["Year"]==2012]
c=original.loc[original["Year"]==2013]
d=original.loc[original["Year"]==2014]

# 接下来就是对四组数据进行分组并各自求平均薪资
a_2011=a.groupby(["JobTitle"])[["TotalPay"]].mean().sort_values(by="TotalPay",ascending=False).reset_index()
a_2011['JobTitle']=a_2011['JobTitle'].str.capitalize()#这里是为了让工作名称即JobTitle的首字母大写，与其他三组一致
b_2012=b.groupby(["JobTitle"])[["TotalPay"]].mean().sort_values(by="TotalPay",ascending=False).reset_index()
c_2013=c.groupby(["JobTitle"])[["TotalPay"]].mean().sort_values(by="TotalPay",ascending=False).reset_index()
d_2014=d.groupby(["JobTitle"])[["TotalPay"]].mean().sort_values(by="TotalPay",ascending=False).reset_index()

f, axs = plt.subplots(2,2,figsize=(20,15))#2x2的子图组合，大小是20x15

sns.barplot(x=a_2011['JobTitle'].head(5), y=a_2011['TotalPay'].head(5), palette="Greens_d",data=a_2011, ax=axs[0,0])#子图的数据，位置等设置
axs[0,0].set_title('2011年SF工资top5',fontsize=15)#标题
axs[0,0].set_xlabel('工作')
axs[0,0].set_ylabel('平均薪资')

sns.barplot(x=b_2012['JobTitle'].head(5), y=b_2012['TotalPay'].head(5), palette="Greens_d",data=b_2012, ax=axs[0,1])
axs[0,1].set_title('2012年SF工资top5',fontsize=15)
axs[0,1].set_xlabel('工作')
axs[0,1].set_ylabel('平均薪资')

sns.barplot(x=c_2013['JobTitle'].head(5), y=c_2013['TotalPay'].head(5), palette="Greens_d",data=c_2013.head(5), ax=axs[1,0])
axs[1,0].set_title('2013年SF工资top5',fontsize=15)
axs[1,0].set_xlabel('工作')
axs[1,0].set_ylabel('平均薪资')

sns.barplot(x=d_2014['JobTitle'].head(5), y=d_2014['TotalPay'].head(5), palette="Greens_d",data=d_2014.head(5), ax=axs[1,1])
axs[1,1].set_title('2014年SF工资top5',fontsize=15)
axs[1,1].set_xlabel('工作')
axs[1,1].set_ylabel('平均薪资')

# plt.show()

'''
利用折线图查看几个职业在三年里的平均薪资的变化
'''
# 选择了12年工资最高的五个职业，来进行查看
job_list=["Chief of Police","Chief, Fire Department","Gen Mgr, Public Trnsp Dept","Executive Contract Employee","Asst Chf of Dept (Fire Dept)"]

# 筛选这三年里对应职业的薪酬，并生成一个字典
def check_job(x):
    salary_dict={}
    for i in range(len(x["JobTitle"])):
        if x.loc[i,'JobTitle'] in job_list:
            salary_dict[x.loc[i,'JobTitle']]=x.loc[i,'TotalPay']
    return salary_dict

d1=check_job(a_2011)
d2=check_job(b_2012)
d3=check_job(c_2013)
d4=check_job(d_2014)
# print(d1, d2, d3, d4)

# 最后将生成的字典整理一下
salary={'Chief of Police':[321552.11,339282.07,326716.76],
 'Chief, Fire Department':[ 314759.6,336922.01,326233.44],
 'Gen Mgr, Public Trnsp Dept': [294000.17,305307.89,294000.18],
 'Executive Contract Employee': [273776.24,207269.5166666667,278544.71],
 'Asst Chf of Dept (Fire Dept)': [270674.81666666665,294846.6766666667,279768.9583333334]}
print(salary)

# 将字典生成dataframe格式，并生成图片
df=pd.DataFrame(salary,index=["2012","2013","2014"])
df.plot()#生成折线图
# 当然数据特征值的选择有点问题，如果时间可以在拉长一点的话，这个图表会更加直观。
# plt.show()

'''
利用热力图查看特征值的相关性
相关关系，是指2个或2个以上变量取值之间在某种意义下所存在的规律，其目的在于探寻数据集里所隐藏的相关关系网。
一般采用相关系数来描述两组数据的相关性，而相关系数则是由协方差除以两个变量的标准差而得，相关系数的取值会在 [-1, 1] 之间，-1 表示完全负相关，1 表示完全相关。
相关性在数据分析和数据挖掘都有着非常重要的作用。而对于相关性的表现，可以用热力图非常直观的表现出来。
'''

del original["Notes"]#删掉note这个不相关的特征值
plt.figure(figsize=(20,20))
plt.rcParams['font.sans-serif']=['SimHei'] #定义字体避免出现乱码的情况
plt.rcParams['axes.unicode_minus']=False
sns.heatmap(original.corr(),linewidths=0.5,vmax=1.0, square=True, linecolor='white', annot=True, cmap="YlGnBu" )#。corr（）就是相关系数
plt.show()